/* Includes ------------------------------------------------------------------*/
#include <main.h>

/* Private define-------------------------------------------------------------*/
#define S2RI    BIT0        //串口2接收中断请求标志位
#define S2TI    BIT1        //串口2发送中断请求标志位

#define UART2_Send_LENGTH 10
#define UART2_Rec_LENGTH  100
/* Private variables----------------------------------------------------------*/
static uint8_t xdata ucSend_Buffer[UART2_Rec_LENGTH]  = {0x00};
static uint8_t xdata ucRec_Buffer[UART2_Rec_LENGTH]   = {0x00};
/* Private function prototypes------------------------------------------------*/
static void Init(void);                                 //串口初始化
static void SendData(uint8_t );                     //串口发送字符
static void SendArray(uint8_t *,uint16_t );         //串口发送数组
static void SendString(uint8_t *);                  //串口发送字符串
static void Protocol(void);                             //串口协议

static void RS485_Set_SendMode(void);                   //RS-485设置为发送模式
static void RS485_Set_RecMode(void);                    //RS-485设置为接收模式

/* Public variables-----------------------------------------------------------*/
UART_t idata UART2 = 
{
  Band_115200,      //WIFI模块通信波特率为115200
  FALSE,
  FALSE,
  0,

  ucSend_Buffer,
  ucRec_Buffer,

  Init,
  SendData,
  SendArray,
  SendString,
  Protocol,

  TTL,
  RS485_Set_SendMode,
  RS485_Set_RecMode
};

/*
* @name   Init
* @brief  串口2初始化
* @param  None
* @retval None   
*/
static void Init()
{
    /*P_SW2 外围设备功能切换控制寄存器2(不可位寻址)的BIT0位默认为0，即串口2切换位S2_S为0
    默认串口2映射到P10和P11上，所以P_SW2寄存器不用配置*/

    S2CON = 0x50;		//8位数据,可变波特率,第4位S2REN位置1，开启中断
    //AUXR = 0000 0100，AUXR不可位寻址，T2x12为定时器2速度选择位，置1则定时器2的速度是传统8051的12倍，不分频
	  AUXR |= 0x04;
    switch (UART2.ucBandRate)
    {
        case Band_4800:   T2L = 0xCD; T2H = 0xFD; break;
        case Band_9600:   T2L = 0xE0; T2H = 0xFE; break;
        case Band_19200:  T2L = 0x70; T2H = 0xFF; break;
        case Band_115200: T2L = 0xE8; T2H = 0xFF; break;
        default:          T2L = 0xCD; T2H = 0xFD; break;
    }
    AUXR |= BIT4;       //启动定时器2   0001 0000，T2R位置为1，允许定时器2运行
}

/*
* @name   SendData
* @brief  发送字符
* @param  dat：待发送的数据
* @retval None   
*/
static void SendData(uint8_t dat)
{
  while(UART2.ucTX_Busy_Flag);    //等待前面的数据发送完，串口中断中发送数据后标志位会置FALSE
  UART2.ucTX_Busy_Flag = TRUE;    //置为忙碌标志位
  S2BUF = dat;                    //写数据到串口2数据缓冲区S2BUF
}

/*
* @name   SendArray
* @brief  发送数组
* @param  p_Arr：数组首地址，LEN：发送长度
* @retval None   
*/
static void SendArray(uint8_t *p_Arr,uint16_t LEN)
{
  uint16_t i = 0;

  UART2.RS485_Set_SendMode();   //RS-485设置为发送模式

  for(i = 0;i<LEN;i++)
  {
    UART2.UART_SendData(*(p_Arr+i));
  }
  while(UART2.ucTX_Busy_Flag);   //等待数据发送完
  Public.Delay_ms(1);            //等待RS-485数据传输完
  
  UART2.RS485_Set_RecMode();    //让RS-485切回到接收模式，默认处于接收模式
}

/*
* @name   SendString
* @brief  发送字符串
* @param  p_Arr：字符串首地址
* @retval None   
*/
static void SendString(uint8_t *p_Str)
{
  UART2.RS485_Set_SendMode();     //RS-485设置为发送模式

  while(*(p_Str) != '\0')
  {
    UART2.UART_SendData(*(p_Str++));
  }
  while(UART2.ucTX_Busy_Flag);
  Public.Delay_ms(1);             //等待RS-485数据传输完

  UART2.RS485_Set_RecMode();      //RS-485设置为接收模式

}

/*
* @name   RS485_Set_SendMode
* @brief  RS_485接口设置为发送模式
* @param  None
* @retval None   
*/
static void RS485_Set_SendMode()
{

}

/*
* @name   RS485_Set_RecMode
* @brief  RS_485接口设置为接收模式
* @param  None
* @retval None   
*/
static void RS485_Set_RecMode()
{
  
}

/*
* @name   UART1_isr
* @brief  串口2中断处理函数
* @param  None
* @retval None   
*/
void UART2_isr() interrupt 8
{
    //接收
    if(S2CON & S2RI)    //取出S2CON的BIT0位进行判断，如果是1则是接收中断，如果为0则不是
    {
        S2CON &= ~S2RI;                   //清除接收中断标志
        /*UART1_Rec_LENGTH宏定义为10，所以接收的数据不能超过10个字节
        UART1.ucRec_Cnt表示数组下标，初始化为0*/
        if(UART2.ucRec_Cnt < UART2_Rec_LENGTH)
        {
            ucRec_Buffer[UART2.ucRec_Cnt++] = S2BUF;
        }
        UART2.ucRec_Flag = TRUE;      //接收完成标志位
    }
    //发送
    if(S2CON & S2TI)
    {
        S2CON &= ~S2TI;                    //清除发送中断标志
        UART2.ucTX_Busy_Flag = FALSE;   //清除忙碌标志
    }
}

/*
* @name   Protocol
* @brief  串口协议
* @param  None
* @retval None   
*/
static void Protocol()
{
  
}
/********************************************************
  End Of File
********************************************************/